#include <REGX52.H>
#include "INTRINS.H"
#include "Timer.h"

#define Sound_Speed 340 // 声速，单位：m/s

sbit HCSR04_Trig = P2 ^ 0;
sbit HCSR04_Echo = P2 ^ 1; // 建议使用外部中断引脚，如P3.2(INT0)或P3.3(INT1)

unsigned int Echo_Time = 0; // 回声时间，单位：μs
float Distance = 0;         // 距离，单位：cm

/**
 * @brief 产生10μs的Trig高电平脉冲
 */
void HCSR04_Trigger(void)
{
    HCSR04_Trig = 1; // 置高电平
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();         // 延时约10μs
    HCSR04_Trig = 0; // 置低电平
}

/**
 * @brief 超声波测距函数
 * @retval 返回测量到的距离，单位：cm
 */
float HCSR04_GetDistance(void)
{
    // 产生10μs的Trig脉冲
    HCSR04_Trigger();

    // 等待Echo信号变高
    while (HCSR04_Echo == 0)
        ;

    // 初始化定时器并开始计时
    Timer0_Init(); // Timer0_Init配置为1μs计数一次
    Timer0_SetCounter(0);
    Timer0_Run(1); // 启动定时器

    // 等待Echo信号变低
    while (HCSR04_Echo == 1)
        ;

    // 停止定时器并获取计数值
    Timer0_Run(0);
    Echo_Time = Timer0_GetCounter();

    // 计算距离（单位：cm）
    // 距离 = (时间 × 声速) / 2
    // 时间单位转换为秒：Echo_Time × 10^-6
    // 声速单位转换为cm/μs：340 × 100 / 1000000 = 0.034
    // 简化公式：Distance = Echo_Time × 0.034 / 2 = Echo_Time × 0.017
    Distance = Echo_Time * 0.017;

    return Distance;
}

/**
 * @brief 超声波模块初始化
 */
void HCSR04_Init(void)
{
    HCSR04_Trig = 0; 

}
